package gitee_hook

import (
	"strconv"

	"jihulab.com/linksaas/proto-gen-go/events/events_gitee"
)

type NoteHook struct {
	HookId        int32        `json:"hook_id"`         // 钩子 id。
	HookUrl       string       `json:"hook_url"`        // 钩子路由。
	HookName      string       `json:"hook_name"`       // 钩子名，固定为 note_hooks。
	Password      string       `json:"password"`        // 钩子密码。eg：123456
	Timestamp     string       `json:"timestamp"`       // 触发钩子的时间戳。eg: 1576754827988
	Sign          string       `json:"sign"`            // 钩子根据密钥计算的签名。eg: "rLEHLuZRIQHuTPeXMib9Czoq9dVXO4TsQcmQQHtjXHA="
	Action        string       `json:"action"`          // 评论的动作。eg：comment
	Comment       Note         `json:"comment"`         // 评论的数据信息。
	Repository    *Project     `json:"repository"`      // 评论所在仓库的信息。
	Project       *Project     `json:"project"`         // 评论所在仓库的信息。
	Author        *User        `json:"author"`          // 评论的作者信息。
	Sender        *User        `json:"sender"`          // 评论的作者信息。
	Url           string       `json:"url"`             // 这条评论在 Gitee 上的 url。eg：https://gitee.com/oschina/git-osc#note_1
	Note          string       `json:"note"`            // 评论内容。eg：好的东西应该开源...
	NoteableType  string       `json:"noteable_type"`   // 被评论的目标类型。eg：Issue
	NoteableId    int32        `json:"noteable_id"`     // 被评论的目标 id。
	Issue         *Issue       `json:"issue"`           // 被评论的 Issue 信息。
	PullRequest   *PullRequest `json:"pull_request"`    // 被评论的 PR 信息。
	Title         string       `json:"title"`           // 被评论的目标标题。eg：这是一个 PR 标题
	PerIid        string       `json:"per_iid"`         // 被评论的目标标识。eg：IG6E9
	ShortCommitId *string      `json:"short_commit_id"` // 被评论的 commit 提交中的简短 sha。eg：51b1acb
	Enterprise    *Enterprise  `json:"enterprise"`      // 被评论的目标所在的企业信息。
}

func (item *NoteHook) ToProtoBuf() *events_gitee.NoteEvent {
	ret := &events_gitee.NoteEvent{
		HookId:        item.HookId,
		HookUrl:       item.HookUrl,
		HookName:      item.HookName,
		Sign:          item.Sign,
		Action:        item.Action,
		Comment:       item.Comment.ToProtoBuf(),
		Project:       []*events_gitee.Project{},
		Author:        []*events_gitee.User{},
		Sender:        []*events_gitee.User{},
		Url:           item.Url,
		Note:          item.Note,
		NoteableType:  item.NoteableType,
		NoteableId:    item.NoteableId,
		Issue:         []*events_gitee.Issue{},
		PullRequest:   []*events_gitee.PullRequest{},
		Title:         item.Title,
		PerIid:        item.PerIid,
		ShortCommitId: []string{},
		Enterprise:    []*events_gitee.Enterprise{},
	}
	if item.Project != nil {
		ret.Project = append(ret.Project, item.Project.ToProtoBuf())
	}
	if item.Author != nil {
		ret.Author = append(ret.Author, item.Author.ToProtoBuf())
	}
	if item.Sender != nil {
		ret.Sender = append(ret.Sender, item.Sender.ToProtoBuf())
	}
	if item.Issue != nil {
		ret.Issue = append(ret.Issue, item.Issue.ToProtoBuf())
	}
	if item.PullRequest != nil {
		ret.PullRequest = append(ret.PullRequest, item.PullRequest.ToProtoBuf())
	}
	if item.ShortCommitId != nil && *item.ShortCommitId != "" {
		ret.ShortCommitId = append(ret.ShortCommitId, *item.ShortCommitId)
	}
	if item.Enterprise != nil {
		ret.Enterprise = append(ret.Enterprise, item.Enterprise.ToProtoBuf())
	}
	ret.Timestamp, _ = strconv.ParseInt(item.Timestamp, 10, 64)
	return ret
}
